package com.xudm.cdg.controller;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.crypto.digest.MD5;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Tables;
import com.deepoove.poi.data.style.BorderStyle;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.xudm.cdg.api.MoonShotApi;
import com.xudm.cdg.api.TyqwApi;
import com.xudm.cdg.entity.cosmic.DataDict;
import com.xudm.cdg.service.DataDictService;
import com.xudm.cdg.service.RedisService;
import com.xudm.cdg.utils.MarkdownUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@Slf4j
@RequestMapping("/test")
public class TestController {
    @Resource
    private RedisService redisService;

    @Resource
    private DataDictService dataDictService;
    @Resource
    private TyqwApi qwApi;

    @Resource
    private MoonShotApi moonShotApi;

    private final MD5 md5 = MD5.create();

    public static final String JOSN_IMG_PROMPT = "你会接受一串由顿号或逗号分隔的文本，将其分割、翻译成英文，多个单词使用小驼峰或者下划线来连接，并将其视为一个变量。然后根据该变量提供合适的案例值，并组装成一个单层 JSON 对象。JSON 对象中变量名只能使用英文，而案例值可以使用中文。" +
            "例如你收到\"节点查询状态，人员配置查询状态，投诉工单节点明细信息，水果名称\"\n" + "最终输出的 JSON 对象示例：\n" + "{\\n\"node_query_status\": \"成功\",\\n\"staffing_query_status\":\"\\成功状态\",\\n\"complaint_work_order_node_details\":\"投诉工单节点明细信息xxxxxx\",\\n\"fruit_name\":\"苹果,香蕉,橙子\"\\n}";
    public static final String DICT_TABLE_PROMPT = "你将收到一段用逗号或者顿号分隔的文本，你需要做的是把这些文本分割以后的词汇翻译成英文，多个单词使用小驼峰连接，然后给出变量如果作为mysql数据库表的字段，应该要用什么数据类型、长度、非空等，非空以0或者1表示，并以markdown表格的形式输出，表头为字段名、别名、类型、长度、非空，只返回markdown格式的表格，不需要多余的描述。";


    @RequestMapping("/redis")
    public String redis() {
        MD5 md5 = MD5.create();
        String k = md5.digestHex("ascsacsacascascascasc");
        log.info("k:{}", k);
        redisService.set(k, k);
        return "test";
    }

    @RequestMapping("/test2")
    public String[][] test2(String question) throws IOException {
        String digestHex = md5.digestHex(question);
        String object = redisService.get(digestHex, String.class);
        String result = "";
        if (object != null) {
            result = object;
        } else {
            JSONObject jsonObject = qwApi.chatByQw(question, DICT_TABLE_PROMPT);
            JSONArray jsonArray = jsonObject.getJSONObject("output").getJSONArray("choices");
            JSONObject json = (JSONObject) jsonArray.get(0);
            result = json.getJSONObject("message").getString("content");
            redisService.set(digestHex, result);
        }
        String dict = dataDictService.getDict(result);
        String[][] stringArrays = MarkdownUtil.parseMarkdownTable(dict);
        Map<String, Object> dataMap = new HashMap<>();

        List<DataDict> dictList = new ArrayList<>();
        for (int i = 2; i < stringArrays.length; i++) {
            String[] strings = stringArrays[i];
            dictList.add(new DataDict(strings[0], strings[1], strings[2], strings[3], strings[4], ""));
        }

        dataMap.put("dictList", dictList);

        //表格行循环
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder()
                .bind("dictList", policy).build();

        XWPFTemplate template = XWPFTemplate.compile("D:\\DevelopSpace\\XW_Space\\workspace\\COSMIC\\template\\table0.docx", config).render(dataMap);
        template.writeAndClose(new FileOutputStream("D:\\DevelopSpace\\XW_Space\\workspace\\COSMIC\\template\\测试表格生成-" + LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN) + ".docx"));
        return stringArrays;
    }

    @RequestMapping("/test3")
    public String test3(@RequestParam String question) {
//        JSONObject jsonObject = qwApi.chatByQw(question, JOSN_IMG_PROMPT);
        JSONObject jsonObject = moonShotApi.singleChat(question, JOSN_IMG_PROMPT);
        String result = "";
//        JSONArray jsonArray = jsonObject.getJSONObject("output").getJSONArray("choices");
        JSONArray jsonArray = jsonObject.getJSONArray("choices");
        JSONObject json = (JSONObject) jsonArray.get(0);
        result = json.getJSONObject("message").getString("content");
//        String jsonText = MarkdownUtil.extractJsonFromMarkdown(result);
//        InputStream dataDictJsonImg = dataDictService.getDataDictJsonImg(question);
//        //把字节输出流转成文件保存到本地
//        try {
//            MarkdownUtil.writeOutputStreamToFile(dataDictJsonImg, "D:\\DevelopSpace\\XW_Space\\workspace\\COSMIC\\template\\测试表格生成-" + LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN) + ".png");
//            log.info("文件写入成功");
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        return result;
    }

    @RequestMapping("/test4")
    public String getQuestionMd5(String question) {
        String dictQuestion = "请把“" + question + "”翻译成变量并给出合适的案例值然后组装成json,json组装以翻译后的变量名为key，案例数据为value。注意事项：json对象只能一层键值对的形式，不要嵌套且不能包含注释；变量需要符合标识符命名规则，不能包含中文，多个英文使用下划线分割或者使用小驼峰命名；案例值不能为对象。输出案例：```json\n{\n  \"reportFlowFormComponentAssociationSettingsUrl\": \"http://example.com/reportFlowSettings\",\n  \"componentId\": \"C001\"\n}\n``` ";
        return md5.digestHex(dictQuestion);
    }


}
